#ifndef STREAMINGEXPORTMANAGER_H
#define STREAMINGEXPORTMANAGER_H

#include <QObject>
#include <QThread>
#include <QAtomicInt>
#include <QImage>
#include <QString>
#include <QList>
#include "processingsettings.h"
#include "unifiedfileinfo.h"
#include "layoutstatemanager.h"
#include "fileidentitymanager.h"
#include "globalpagemanager.h"

class UnifiedPageRenderer;
class UnifiedCacheManager;
class QPdfWriter;
class QPainter;

/**
 * 流式导出管理器
 * 
 * Martin Fowler 重构原则：
 * - 单一职责：只负责导出流程管理
 * - KISS：避免过度设计，保持简单
 * - 流式处理：逐页加载和写入，内存友好
 * 
 * 核心特性：
 * 1. 单线程导出：消除多线程复杂性
 * 2. 流式处理：边加载边写入，内存占用最小
 * 3. 统一取消：每页检查，响应快速
 * 4. 完全幂等：所有操作可重复调用
 */
class StreamingExportManager : public QObject
{
    Q_OBJECT

public:
    explicit StreamingExportManager(QObject* parent = nullptr);
    ~StreamingExportManager();

    // 注意：渲染器和缓存管理器都在内部自动初始化
    // 渲染器：独立创建（线程安全）
    // 缓存管理器：使用单例（公用，只读安全）

    /**
     * 启动流式导出
     * @param files 文件列表
     * @param settings 处理设置
     * @param outputPath 输出路径
     * 
     * 幂等性：如果已在导出，拒绝启动
     */
    void startExport(const QList<UnifiedFileInfo>& files,
                    const ProcessingSettings& settings,
                    const QString& outputPath);

    /**
     * 取消导出
     * 
     * 幂等性：可重复调用，安全无副作用
     * 响应速度：< 100ms（每页检查）
     */
    void cancelExport();

    /**
     * 查询导出状态
     */
    bool isExporting() const;

signals:
    // 导出开始
    void exportStarted(int totalFiles, const QString& outputPath);

    // 进度更新（当前进度百分比，总进度百分比）
    // 0-20%: 计算总页数阶段
    // 20-99%: 导出阶段
    // 100%: 完成阶段
    void progressUpdated(int currentProgress, int totalProgress, const QString& statusText = QString());

    // 导出完成
    void exportCompleted(const QString& outputPath);

    // 导出失败
    void exportFailed(const QString& error);

    // 导出取消
    void exportCancelled();

private:
    /**
     * 核心导出循环（在后台线程中执行）
     * 
     * 新流程（模拟用户翻页）：
     * for each file:
     *     1. 加载该文件的所有显示页（按导出DPI）
     *     2. for each display page:
     *         - 检查取消标志
     *         - 渲染到PDF
     *         - 更新进度
     *     3. 释放该文件的所有页面
     */
    void exportLoop(const QList<UnifiedFileInfo>& files,
                   const ProcessingSettings& settings,
                   const QString& outputPath);

    /**
     * 加载文件的所有显示页（模拟用户浏览）
     * 核心：从缓存加载已经切割好的页面（与 MainWindow::loadAllPagesForFile 相同）
     * 
     * @param file 文件信息
     * @param settings 处理设置（未使用，保留用于将来扩展）
     * @return 该文件的所有显示页（从缓存加载）
     */
    QList<QImage> loadDisplayPagesForFile(const UnifiedFileInfo& file,
                                         const ProcessingSettings& settings);

    /**
     * 渲染页面到PDF（简化版）
     */
    void renderPageToPDF(const QImage& page,
                        QPainter& painter,
                        QPdfWriter& pdfWriter,
                        int globalPageNumber,
                        int totalPages);

    /**
     * 取消检查（内联，高性能）
     */
    inline bool shouldCancel() const {
        return m_cancelRequested.loadAcquire() == 1;
    }

    /**
     * 计算A4页面高度（像素）
     */
    int calculateA4HeightInPixels(double dpi) const;

    /**
     * 清理资源
     */
    void cleanup();

private:
    // 状态管理（简化：只有两个状态）
    QAtomicInt m_isExporting;      // 0=空闲, 1=导出中
    QAtomicInt m_cancelRequested;  // 0=正常, 1=取消

    // 单一导出线程
    QThread* m_exportThread;

    // 渲染器（必需）
    UnifiedPageRenderer* m_renderer;
    
    // 缓存管理器（必需）
    class UnifiedCacheManager* m_cacheManager;

    // 处理设置（线程局部副本）
    ProcessingSettings m_settings;

    // 常量（已移除 PROGRESS_UPDATE_INTERVAL - 现在每页都更新进度）
    static constexpr int A4_WIDTH_MM = 210;
    static constexpr int A4_HEIGHT_MM = 297;
    static constexpr double MM_TO_INCH = 25.4;
};

#endif // STREAMINGEXPORTMANAGER_H

